#include "ScnsSt7789.c.h"

#if defined(SCNS_ST7789_ENABLE)&&SCNS_ST7789_ENABLE==1

#include "ScnsSmctp.h"
#include "ScnsTimer.h"

const ScnsBspSt7789Config scnsBspSt7789Config[SCNS_ST7789_MAX]={
    {
        .dir=0,
        .horizon=240,
        .vertical=320,
        .horizonBias=0,
        .verticalBias=0,
        .bgr=0,
        .reverseColor=0,
    },
};

#define PTX_SPI     SPI_3
#define PTX_SCL     SPI3_SCK_D4
#define PTX_MOSI    SPI3_MOSI_D6
#define PTX_MISO    SPI_MISO_NULL
#define PTX_CS      D7
#define PTX_DC      D5
#define PTX_RST     D14
#define PTX_BL      D15

ScnsStatus scnsBspSt7789Init(ScnsSt7789Enum stn)
{
    spi_init(PTX_SPI,SPI_MODE0,system_clock/2,PTX_SCL,PTX_MOSI,PTX_MISO,SPI_CS_NULL);
    gpio_init(PTX_CS,GPO,GPIO_HIGH,GPO_PUSH_PULL);
    gpio_init(PTX_DC,GPO,GPIO_LOW,GPO_PUSH_PULL);
    gpio_init(PTX_RST,GPO,GPIO_LOW,GPO_PUSH_PULL);      // RTS
    gpio_init(PTX_BL,GPO,GPIO_LOW,GPO_PUSH_PULL);       // BL
    dma_finish_nvic_enable(spi_tx_dma[PTX_SPI],1);
    return SCNS_STATUS_OK;
}

ScnsStatus scnsBspSt7789SetCs(ScnsSt7789Enum stN,uint8 cs)
{
    if(cs==0)
    {
        while(gpio_get_level(PTX_CS)==0);
        gpio_set_level(PTX_CS,0);
    }
    else
    {
        gpio_set_level(PTX_CS,1);
    }
    return SCNS_STATUS_OK;
}

ScnsStatus scnsBspSt7789SetRst(ScnsSt7789Enum stn,uint8 dat)
{
    gpio_set_level(PTX_RST,dat);
    return SCNS_STATUS_OK;
}

ScnsStatus scnsBspSt7789WReg(ScnsSt7789Enum stn,uint8 dat)
{
    gpio_set_level(PTX_DC,0);
    spi_write_8bit(PTX_SPI,dat);
    return SCNS_STATUS_OK;
}

ScnsStatus scnsBspSt7789WData(ScnsSt7789Enum stn,uint8 dat)
{
    gpio_set_level(PTX_DC,1);
    spi_write_8bit(PTX_SPI,dat);
    return SCNS_STATUS_OK;
}

ScnsStatus scnsBspSt7789WData16S(ScnsSt7789Enum stn,uint16 dat[],uint32 len)
{
    gpio_set_level(PTX_DC,1);
    spi_write_8bit_array(PTX_SPI,(uint8*)dat,len*2);
    return SCNS_STATUS_OK;
}

ScnsStatus scnsBspSt7789WData16SAsync(ScnsSt7789Enum stn,uint16 dat[],uint32 len)
{
    SCB_CleanDCache_by_Addr((uint32_t*)dat,len*2);
    gpio_set_level(PTX_DC,1);
    spi_mosi_dma(PTX_SPI,(uint8*)dat,len*2,NULL,0,0);
    dma_finish_nvic_enable(spi_tx_dma[PTX_SPI],1);
    return SCNS_STATUS_OK;
}

ScnsStatus scnsBspSt7789SetBackgroundLight(ScnsSt7789Enum stn,ScnsLcdBackgroundLightStatus status)
{
    gpio_set_level(PTX_BL,status==SCNS_LCD_BACKGROUND_LIGHT_ON?1:0);
    return SCNS_STATUS_OK;
}

#endif
